import tensorflow as tf

#使用监督学习的方式来合理地设置参数取值。
# 监督学习最重要的思想就是，在已知答案的标注数据集上，
# 模型给出的预测结果要尽量接近真实的答案。
w1 = tf.Variable(tf.random_normal([2,3],stddev=1.0))
w2 = tf.Variable(tf.random_normal([3,1],stddev=1.0))

# x = tf.placeholder(tf.float32, shape=(1,2),name="input")
x = tf.placeholder(tf.float32, shape=(3,2),name="input")
a = tf.matmul(x, w1)
y = tf.matmul(a, w2)

sess = tf.Session()
init_op = tf.initialize_all_variables()
sess.run(init_op)

# 下一行报错 
# InvalidArgumentError: <unprintable InvalidArgumentError object>
# 原因是没有给placeholder赋值
# print(sess.run(y))

# 这个和之前3.4.2一样的结果
# print(sess.run(y, feed_dict={x: [[0.7,0.9]]}))

# 如果前面x定义换成这样 x = tf.placeholder(tf.float32, shape=(3,2),name="input")
'''
[[-4.32894516]
 [-0.92559266]
 [-3.26994038]]
'''
print(sess.run(y,feed_dict={x:[[0.7,0.9],[0.1,0.4],[0.5,0.8]]}))

# 定义损失函数来刻画预测值和真实值的差距
'''
书上这里加入 第一个y是y_，报错，所以我替换为y
'''
cross_entropy = -tf.reduce_mean(
    y * tf.log(tf.clip_by_value(y,1e-10,1.0))
)

# 定义学习率，在第四章具体介绍
learning_rate = 0.001

# 定义反向传播算法来优化神经网络中的参数,tf优化器目前有七种
train_step = tf.train.AdamOptimizer(learning_rate).minimize(cross_entropy)